package com.fruits.login.model;

import com.fruits.login.model.properties.LoginProperties;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.*;

@Slf4j
public class SmsCodeSingle {

    private static List<SmsCode> smsCodes = new ArrayList<>();
    public static List<SmsCode> instance() {
        return smsCodes;
    }

    private static Map<String,SmsCode> smsCodeMap = new HashMap<>();
    public static Map<String,SmsCode> instanceMap(){
        return smsCodeMap;
    }

    public boolean addSmsCode(SmsCode smsCode) {
        log.info("addSmsCode:" + smsCode.getPhone());
        if (instanceMap().containsKey(smsCode)) {
            SmsCode thisSmsCode = instanceMap().get(smsCode.getPhone());
            log.info("已存在" + thisSmsCode.getPhone() + "记录");
            if ((new Date().getTime() - thisSmsCode.getGenerateTime().getTime()) < LoginProperties.SMS_CODE_ONCE_AGAIN) {
                log.info(smsCode.getPhone() + ":4分钟内不能重复获取验证码");
                return false;
            }
        }
        instanceMap().put(smsCode.getPhone(),smsCode);
        return true;
    }
//    public boolean addSmsCode(SmsCode smsCode) {
//        Iterator<SmsCode> iterator = instance().iterator();
//        while (iterator.hasNext()){
//            SmsCode thisSms = iterator.next();
//            log.info("循环:" + thisSms.getPhone());
//            if (thisSms.getPhone().equals(smsCode.getPhone())){
//                log.info("缓存中已存在" + smsCode.getPhone() + "对应验证码");
//                if ((new Date().getTime() - thisSms.getGenerateTime().getTime()) < LoginProperties.SMS_CODE_ONCE_AGAIN){
//                    log.info(smsCode.getPhone() + ":短时间内不能重复获取验证码");
//                    return false;
//                }else {
//                    log.info(smsCode.getPhone() + ": 清除旧验证码:" + thisSms.getCode());
//                    iterator.remove();
//                    break;
//                }
//            }
//        }
//        log.info(smsCode.getPhone() + ": 添加新验证码:" + smsCode.getCode());
//        instance().add(smsCode);
//        return true;
//    }

    /**
     * 检测验证码
     * 验证码正确和验证码过期都清除内存中的对应手机号验证码信息
     *
     * @param smsCode
     * @return
     */
//    public ReturnMsg checkSmsCode(SmsCode smsCode) {
//        ReturnMsg msg = new ReturnMsg();
//        for (int i = 0; i < instance().size(); i++) {
//            System.out.println(instance().get(i).toString());
//        }
//        Iterator<SmsCode> iterator = instance().iterator();
//        while (iterator.hasNext()) {
//            SmsCode thisSms = iterator.next();
//            if (!thisSms.getPhone().equals(smsCode.getPhone())){
//                log.info("比较号码:" + thisSms.getPhone() + "  ;   " + "传入号码:" + smsCode.getPhone());
//                continue;
//            }
//            if ((smsCode.getGenerateTime().getTime() - thisSms.getGenerateTime().getTime()) > LoginProperties.SMS_CODE_FAILURE_TIME) {
//                msg.setState(LoginProperties.RETURN_MSG_FAILE);
//                msg.setInfo("验证码过期");
//                log.info(thisSms.toString() + " 验证码过期并删除");
//                iterator.remove();
//                return msg;
//            }
//            if (!thisSms.getCode().equals(smsCode.getCode())){
//                msg.setState(LoginProperties.RETURN_MSG_FAILE);
//                msg.setInfo("验证码错误");
//                log.info("传入验证码:" + smsCode.getCode() + ";" + " 正确验证码:" + thisSms.getCode());
//                return msg;
//            }
//            msg.setState(LoginProperties.RETURN_MSG_SUCCESS);
//            log.info(thisSms.toString() + " 验证成功并删除");
//            iterator.remove();
//            return msg;
//        }
//        /*for (int i = 0; i < instance().size(); i++) {
//            //查找对应手机号
//            if (!instance().get(i).getPhone().equals(smsCode.getPhone())) {
//                continue;
//            }
//            //开始验证
//            if (!instance().get(i).getCode().equals(smsCode.getCode())) {
//                msg.setState(LoginProperties.RETURN_MSG_FAILE);
//                msg.setInfo("验证码错误");
//                log.info("传入验证码:" + smsCode.getCode() + ";" + " 正确验证码:" + instance().get(i).getCode());
//                return msg;
//            }
//            if ((smsCode.getGenerateTime().getTime() - instance().get(i).getGenerateTime().getTime()) > LoginProperties.SMS_CODE_FAILURE_TIME) {
//                msg.setState(LoginProperties.RETURN_MSG_FAILE);
//                msg.setInfo("验证码过期");
//                log.info(instance().get(i).toString() + " 验证码过期并删除");
//                instance().remove(i);
//                return msg;
//            }
//            //验证码验证成功
//            msg.setState(LoginProperties.RETURN_MSG_SUCCESS);
//            log.info(instance().get(i).toString() + " 验证成功并删除");
//            instance().remove(i);
//            return msg;
//        }*/
//        msg.setState(LoginProperties.RETURN_MSG_FAILE);
//        msg.setInfo(smsCode.getPhone() + "请先获取验证码");
//        log.info(smsCode.getPhone() + "请先获取验证码");
//        return msg;
//    }
    public ReturnMsg checkSmsCode(SmsCode smsCode) {
        log.info("验证码验证码:");
        log.info("传入信息:" + smsCode.toString());
        ReturnMsg msg = new ReturnMsg();
        if (!smsCodeMap.containsKey(smsCode.getPhone())) {
            msg.setState(LoginProperties.RETURN_MSG_FAILE);
            msg.setInfo(smsCode.getPhone() + "请先获取验证码");
            log.info(smsCode.getPhone() + "请先获取验证码");
            return msg;
        }
        SmsCode thisSmsCode = smsCodeMap.get(smsCode.getPhone());
        log.info("缓存对应信息:" + thisSmsCode.toString());
        if ((smsCode.getGenerateTime().getTime() - thisSmsCode.getGenerateTime().getTime()) > LoginProperties.SMS_CODE_FAILURE_TIME) {
            msg.setState(LoginProperties.RETURN_MSG_FAILE);
            msg.setInfo("验证码过期");
            log.info(thisSmsCode.toString() + " 验证码过期并删除");
            smsCodeMap.remove(smsCode.getPhone());
            return msg;
        }
        if (!thisSmsCode.getCode().equals(smsCode.getCode())) {
            msg.setState(LoginProperties.RETURN_MSG_FAILE);
            msg.setInfo("验证码错误");
            log.info("传入验证码:" + smsCode.getCode() + ";" + " 正确验证码:" + thisSmsCode.getCode());
            return msg;
        }
        msg.setState(LoginProperties.RETURN_MSG_SUCCESS);
        log.info(smsCode.toString() + " 验证成功并删除");
        smsCodeMap.remove(smsCode.getPhone());
        return msg;
    }



    /*public void scheduledCleaning() {
        Iterator iterator = instance().iterator();
        while (iterator.hasNext()){
            if ((new Date().getTime() - ((SmsCode)iterator.next()).getGenerateTime().getTime()) > LoginProperties.SMS_CODE_CLEARING) {
                iterator.remove();
            }
        }
    }*/
    public void scheduledCleaning() {
        log.info("执行清除任务");
        Iterator<Map.Entry<String, SmsCode>> iterator = smsCodeMap.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, SmsCode> entry = iterator.next();
            log.info(entry.getValue().toString());
            if ((new Date().getTime() - entry.getValue().getGenerateTime().getTime()) > LoginProperties.SMS_CODE_CLEARING) {
                log.info("清除" + entry.getKey());
                smsCodeMap.remove(entry.getKey());
            }
        }
        log.info("清除任务完成");
    }

    public static void main(String[] args) {
        instance().add(new SmsCode("123456","13880502769"));
        instance().add(new SmsCode("123456","13880502768"));
        instance().add(new SmsCode("123456","13880502767"));
        instance().add(new SmsCode("123456","13880502766"));
        instance().add(new SmsCode("123456","13880502765"));
        instance().add(new SmsCode("123456","13880502764"));

    }
}
